import axios from 'axios'
import { Message } from 'element-ui'
import { storge, logOut } from '@/utils'
axios.defaults.baseURL = process.env.VUE_APP_URL
axios.defaults.headers['Content-Type'] = 'application/json'
import { refreshToken } from '../api/login'

// 存储请求
let requestList = []
// 删除请求
const deleteRequest = (value) => {
  const index = requestList.indexOf(value)
  requestList.splice(index, 1)
}

const { toString } = Object.prototype
// 添加请求拦截器
axios.interceptors.request.use((config) => {
  // 对重复请求进来拦截（以请求地址（v1/login）+请求方式（get|post|put）等等）+请求参数（data||JSON.stringify(params)||''），作为唯一标识
  const { baseURL, url, method, data, params } = config
  // 默认过滤掉参数是formdata的这种请求（一般是上传文件）
  if (toString.call(data) !== '[object FormData]') {
    const value = JSON.stringify(data) || JSON.stringify(params) || ''
    if (requestList.includes(`${baseURL}${url}${method}${value}`)) {
      return Promise.reject({ message: 'cancelRequest' })
    } else {
      requestList.push(`${baseURL}${url}${method}${value}`)
    }
  }
  // 在发送请求之前做些什么
  config.headers['Authorization'] = storge.getSessionStorage('token') || ''
  return config
}, (error) => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use((response) => {
  const { data, config: { url, method, params } } = response
  // 删除请求
  const value = JSON.stringify(response.config.data) || JSON.stringify(params) || ''
  deleteRequest(`${url}${method}${value}`)
  if (data.error) {
    // token过期，重新刷新token
    if (data.error_code === 1002) {
      // 刷新token,重新请求
      refreshToken().then(res => {
        const { token_type, access_token } = res
        storge.setSessionStorage('token', `${token_type}${access_token}`)
        axios(response.config)
      })
      // 账号无权限
    } else if (data.error_code === 1010) {
      Message.error(`${data.error_desc}, 如需此权限，请联系超级管理员`)
      return Promise.reject(data)
      // token无效
    } else if (data.error_code === 1003 || data.error_code === 1001) {
      // 重置数据,拦截到登录页
      Message.error(`${data.error_desc},即将跳转到登录页面，重新登录`)
      logOut.clearData()
      return Promise.reject(data)
    } else {
      Message.error(data.error_desc)
      return Promise.reject(data)
    }
  } else {
    return data.data
  }
}, (error) => {
  if (error.message === 'cancelRequest') {
    Message.error('请求过于频繁，已取消')
  } else {
    if (error) {
      // 如果不是自动取消请求的，则删除最后一位请求，这样主要是为了防止，后台接口响应失败，但是pending里面已经存在当前请求，导致后续再次去请求，就直接被拦截了
      requestList.pop()
      Message.error(error.message)
    }
  }
  // 对响应错误做点什么
  return Promise.reject(error)
})

export default axios